package santeclair.connexion.webservice.impl;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import santeclair.connexion.dao.parametrage.ParametrageConnexionDao;
import santeclair.connexion.domaine.parametrage.ParametrageConnexion;
import santeclair.connexion.domaine.parametrage.ParametrageConnexionMQSeries;
import santeclair.connexion.domaine.parametrage.ParametrageConnexionSOAP;
import santeclair.connexion.domaine.parametrage.Service;
import santeclair.connexion.domaine.parametrage.ServiceAnnulationPartenaire;
import santeclair.connexion.domaine.parametrage.ServiceCalculPartenaire;
import santeclair.connexion.domaine.parametrage.ServiceIdentificationPartenaire;
import santeclair.connexion.domaine.parametrage.ServicePartenaire;
import santeclair.connexion.parametrage.dto.ExisteConnexionActiveDemandeDto;
import santeclair.connexion.parametrage.dto.ParametrageConnexionDto;
import santeclair.connexion.parametrage.dto.ParametrageConnexionMQSeriesDto;
import santeclair.connexion.parametrage.dto.ParametrageConnexionSOAPDto;
import santeclair.connexion.parametrage.dto.ServiceAnnulationPartenaireDto;
import santeclair.connexion.parametrage.dto.ServiceCalculPartenaireDto;
import santeclair.connexion.parametrage.dto.ServiceIdentificationPartenaireDto;
import santeclair.connexion.parametrage.dto.ServicePartenaireDto;
import santeclair.connexion.parametrage.webservice.ServicePartenaireWebService;
import santeclair.connexion.service.parametrage.ServicePartenaireService;
import santeclair.lunar.framework.util.BeanUtils;
import santeclair.referentiel.bean.Organisme;

/**
 * @see ServicePartenaireWebService
 * 
 * @author fmokhtari
 */
@org.springframework.stereotype.Service
public class ServicePartenaireWebServiceImpl implements ServicePartenaireWebService {

    @Autowired
    private ServicePartenaireService servicePartenaireService;

    @Autowired
    private ParametrageConnexionDao parametrageConnexionDao;

    @Override
    public List<ServicePartenaireDto> getListeServicesPartenaires() {
        List<ServicePartenaire> listeServicesPartenaires = servicePartenaireService.getListeServicesPartenaires();
        List<ServicePartenaireDto> listeServicesPartenairesDtos = new ArrayList<>();
        for (ServicePartenaire servicePartenaire : listeServicesPartenaires) {
            ServicePartenaireDto servicePartenaireDto = getServicePartenaireDtoFromServicePartenaire(servicePartenaire);
            listeServicesPartenairesDtos.add(servicePartenaireDto);
        }
        return listeServicesPartenairesDtos;
    }

    @Override
    public ServicePartenaireDto getServicePartenaire(Integer idServicePartenaire) {
        ServicePartenaire servicePartenaire = servicePartenaireService.getServicePartenaire(idServicePartenaire);
        ServicePartenaireDto servicePartenaireDto = getServicePartenaireDtoFromServicePartenaire(servicePartenaire);
        if (servicePartenaire != null) {
            ParametrageConnexionDto parametrageConnexionDto = wrapParametrageConnexion(servicePartenaire.getParametrageConnexion());
            servicePartenaireDto.setParametrageConnexion(parametrageConnexionDto);
        }
        return servicePartenaireDto;
    }

    @Override
    public void supprimeServicePartenaire(Integer idServicePartenaire) {
        servicePartenaireService.supprimeServicePartenaire(idServicePartenaire);
    }

    @Override
    public ServicePartenaireDto getServicePartenaire(String alias, Integer service, int ordre) throws RuntimeException {
        ServicePartenaire servicePartenaire = servicePartenaireService.getServicePartenaire(alias, service, ordre);
        ServicePartenaireDto servicePartenaireDto = getServicePartenaireDtoFromServicePartenaire(servicePartenaire);
        if (servicePartenaire != null) {
            ParametrageConnexionDto parametrageConnexionDto = wrapParametrageConnexion(servicePartenaire.getParametrageConnexion());
            servicePartenaireDto.setParametrageConnexion(parametrageConnexionDto);
        }
        return servicePartenaireDto;
    }

    /**
     * @param servicePartenaire
     * @return
     */
    private ServicePartenaireDto getServicePartenaireDtoFromServicePartenaire(ServicePartenaire servicePartenaire) {
        ServicePartenaireDto servicePartenaireDto = null;

        if (servicePartenaire == null) {
            return null;
        } else if (servicePartenaire.getIdServicePartenaire() == null) {
            return BeanUtils.copyProperties(servicePartenaire, ServicePartenaireDto.class);
        } else if (ServiceIdentificationPartenaire.class.isAssignableFrom(servicePartenaire.getClass())) {
            servicePartenaireDto = BeanUtils.copyProperties(servicePartenaire, ServiceIdentificationPartenaireDto.class);
        } else if (ServiceCalculPartenaire.class.isAssignableFrom(servicePartenaire.getClass())) {
            servicePartenaireDto = BeanUtils.copyProperties(servicePartenaire, ServiceCalculPartenaireDto.class);
        } else if (ServiceAnnulationPartenaire.class.isAssignableFrom(servicePartenaire.getClass())) {
            servicePartenaireDto = BeanUtils.copyProperties(servicePartenaire, ServiceAnnulationPartenaireDto.class);
        } else {
            servicePartenaireDto = BeanUtils.copyProperties(servicePartenaire, ServicePartenaireDto.class);
        }

        return servicePartenaireDto;
    }

    @Override
    public void saveServicePartenaire(ServicePartenaireDto servicePartenaireDto) {

        ServicePartenaire servicePartenaire = null;
        if (ServiceIdentificationPartenaireDto.class.isAssignableFrom(servicePartenaireDto.getClass())) {
            servicePartenaire = BeanUtils.copyProperties(servicePartenaireDto, ServiceIdentificationPartenaire.class);
        } else if (ServiceCalculPartenaireDto.class.isAssignableFrom(servicePartenaireDto.getClass())) {
            servicePartenaire = BeanUtils.copyProperties(servicePartenaireDto, ServiceCalculPartenaire.class);
        } else if (ServiceAnnulationPartenaireDto.class.isAssignableFrom(servicePartenaireDto.getClass())) {
            servicePartenaire = BeanUtils.copyProperties(servicePartenaireDto, ServiceAnnulationPartenaire.class);
        } else {
            servicePartenaire = BeanUtils.copyProperties(servicePartenaireDto, ServicePartenaire.class);
        }

        if (servicePartenaireDto.getParametrageConnexion() != null) {
            ParametrageConnexion parametrageConnexion = wrapParametrageConnexionDto(servicePartenaireDto.getParametrageConnexion());
            servicePartenaire.setParametrageConnexion(parametrageConnexion);
        }
        servicePartenaireService.saveServicePartenaire(servicePartenaire);
    }

    @Override
    public boolean existeConnexionActive(ExisteConnexionActiveDemandeDto existeConnexionActive) {

        ServicePartenaire servicePartenaire = BeanUtils.copyProperties(existeConnexionActive.getServicePartenaire(), ServicePartenaire.class);

        return servicePartenaireService.existeConnexionActive(servicePartenaire,
                        BeanUtils.copyProperties(existeConnexionActive.getOrganisme(), Organisme.class),
                        BeanUtils.copyProperties(existeConnexionActive.getService(), Service.class), existeConnexionActive.getOrdre());
    }

    private ParametrageConnexion wrapParametrageConnexionDto(ParametrageConnexionDto parametrageDto) {
        if (parametrageDto == null) {
            return null;
        } else if (ParametrageConnexionSOAPDto.class.isAssignableFrom(parametrageDto.getClass())) {
            return BeanUtils.copyProperties(parametrageDto, ParametrageConnexionSOAP.class);
        } else if (ParametrageConnexionMQSeriesDto.class.isAssignableFrom(parametrageDto.getClass())) {
            return BeanUtils.copyProperties(parametrageDto, ParametrageConnexionMQSeries.class);
        } else {
            return BeanUtils.copyProperties(parametrageDto, ParametrageConnexion.class);
        }
    }

    private ParametrageConnexionDto wrapParametrageConnexion(ParametrageConnexion parametrage) {
        if (parametrage == null) {
            return null;
        } else if (ParametrageConnexionSOAP.class.isAssignableFrom(parametrage.getClass())) {
            return BeanUtils.copyProperties(parametrage, ParametrageConnexionSOAPDto.class);
        } else if (ParametrageConnexionMQSeries.class.isAssignableFrom(parametrage.getClass())) {
            return BeanUtils.copyProperties(parametrage, ParametrageConnexionMQSeriesDto.class);
        } else {
            return BeanUtils.copyProperties(parametrage, ParametrageConnexionDto.class);
        }
    }

}
